home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A)[a].zip / Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A)[a].po / CONVERTER.bas < prev    next >
BASIC Source File  |  1996-12-24  |  4KB  |  54 lines

  1. 10  REM  ***********************
  2. 20  REM  * CONVERTER           *
  3. 30  REM  * BY ANTONIO &        *
  4. 40  REM  * ALFONSO DE PASQUALE *
  5. 50  REM  * COPYRIGHT(C) 1989   *
  6. 60  REM  * BY MICROSPARC, INC. *
  7. 70  REM  * CONCORD, MA 01742   *
  8. 80  REM  ***********************
  9. 90  REM 
  10. 100  PRINT  CHR$(21): TEXT : HOME : CLEAR 
  11. 110  HTAB 10: PRINT "FRACTION CONVERTER": HTAB 2: PRINT "BY ANTONIO & ALFONSO DE PASQUALE": PRINT "COPYRIGHT(C) 1989 BY MICROSPARC, INC."
  12. 120  PRINT : PRINT "    DECIMAL/FRACTION SAMPLE OUTPUT": PRINT : PRINT "ORIGINAL INPUT";: PRINT  TAB( 22);"FORMATTED OUTPUT"
  13. 130  FOR X = 1 TO 7: READ V:DN = V: GOSUB 260: PRINT  TAB( 2);V;: PRINT  TAB( 24);DF$: NEXT X: PRINT 
  14. 140  FOR X = 1 TO 7: READ V$:DF$ = V$: GOSUB 440: PRINT  TAB( 2);V$;: PRINT  TAB( 24);DN: NEXT X
  15. 150  END 
  16. 160  DATA  3.33,5.15,3.77,1.02,35.6,23.88,11.05
  17. 170  DATA  "25 1/2","3 4/5","2/3","25/4","5 5/4","11 1/5","135/5"
  18. 180  REM 
  19. 190  REM  **********************
  20. 200  REM  *  CONVERT ROUTINES  *
  21. 210  REM  *     START HERE     *
  22. 220  REM  **********************
  23. 230  REM 
  24. 240  REM  DECIMAL TO FRACTION
  25. 250  REM 
  26. 260 DF$ = "0": ON ((DN <.005)  AND (DN > -.005)) GOTO 400:DN$ =  STR$(DN):L =  LEN(DN$): FOR INDX = 1 TO L: ON ( MID$ (DN$,INDX,1) = ".") GOTO 280: NEXT INDX: REM INITIALIZE VARIABLES, CONVERT NUMBER INTO A STRING, AND LOCATE DECIMAL POINT
  27. 270 DF$ = DN$: RETURN : REM  IF NO DECIMAL POINT, EXIT ROUTINE
  28. 280  IF INDX = 1  THEN DN$ = "0" +DN$:INDX = INDX +1: REM IF NUMBER < 1, THEN ADD A ZERO TO THE STRING
  29. 290 W$ =  LEFT$(DN$,INDX -1) +" ":DEC$ =  MID$ (DN$,INDX,10): IF  VAL(W$) = 0  THEN W$ = "": REM  FIND WHOLE AND DECIMAL PORTIONS OF NUMBER
  30. 300 DEC =  VAL(DEC$):DEC = (100 *( INT((DEC +.005) *100)/100)): IF DEC <.005  THEN DF$ = W$: RETURN : REM  ROUND DECIMAL PORTION TO 2 PLACES; IF THE DECIMAL PORTION IS IS TOO SMALL, EXIT THE ROUTINE
  31. 310 NUM = DEC:DEN = 100:PASS = 0: REM  INITIALIZE NUMERATOR, DENOMINATOR, AND COUNTER
  32. 320  FOR INDX = 10 TO 1  STEP  -1: REM  INITIATE LOOP TO REDUCE FRACTION TO LOWEST TERMS
  33. 330  IF (NUM/INDX =  INT(NUM/INDX))  AND (DEN/INDX =  INT(DEN/INDX))  THEN NUM = (NUM/INDX):DEN = (DEN/INDX): REM  REDUCE THE FRACTION
  34. 340  NEXT INDX:PASS = PASS +1: IF PASS <2  THEN  GOTO 320: REM FINISH LOOP AND REPEAT IT TWICE TO MAKE SURE FRACTION IS IN LOWEST TERMS
  35. 350 NUM$ =  STR$(NUM):DEN$ =  STR$(DEN): REM  CONVERT NUMERATOR AND DENOMINATOR TO STRINGS
  36. 360  IF (NUM$ = "2"  AND DEN$ = "100")  THEN NUM$ = "1":DEN$ = "50": REM CHECK FOR FRACTIONS THAT AREN'T COMPLETELY REDUCED - LINES 360,370,380
  37. 370  IF (NUM$ = "4"  AND DEN$ = "100")  THEN NUM$ = "1":DEN$ = "25"
  38. 380  IF (NUM$ = "8"  AND DEN$ = "100")  THEN NUM$ = "2":DEN$ = "25"
  39. 390 DF$ = W$ +NUM$ +"/" +DEN$: REM  BUILD COMPLETED STRING
  40. 400  IF (DN <0  AND  LEFT$(DF$,1) < >"-"  AND DF$ < >"0")  THEN DF$ = "-" +DF$: RETURN 
  41. 410  RETURN 
  42. 420  REM  FRACTION TO DECIMAL
  43. 430  REM 
  44. 440 W$ = "":DN = 0:DP = 0:L =  LEN(DF$): FOR INDX = 1 TO L: ON ( MID$ (DF$,INDX,1) = "/") GOTO 450: NEXT INDX: GOTO 530: REM  INITIALIZE VARIABLES AND FIND FRACTIONAL PORTION; IF THERE ISN'T A FRACTION, SKIP DOWN TO 530
  45. 450  FOR INDX = 1 TO  LEN(DF$): IF  MID$ (DF$,INDX,1) = " "  THEN W$ =  LEFT$(DF$,INDX):F$ =  MID$ (DF$,INDX +1,10): GOTO 470: REM  TRY TO SPLIT STRING INTO WHOLE AND FRACTIONAL PORTIONS
  46. 460  NEXT INDX:F$ = DF$: REM ACCOUNT FOR A FRACTION WITH NO WHOLE PORTION
  47. 470 L =  LEN(F$): FOR INDX = 1 TO L: IF  MID$ (F$,INDX,1) = "/"  THEN  ON (INDX < = 1) GOTO 530:NUM$ =  LEFT$(F$,INDX -1):DEN$ =  MID$ (F$,INDX +1): GOTO 480: REM  SPLIT FRACTION INTO NUMERATOR AND DENOMINATOR
  48. 480  NEXT INDX
  49. 490 NUM =  VAL(NUM$):DEN =  VAL(DEN$): IF NUM = 0  OR DEN = 0  THEN 530: REM  CONVERT NUMERATOR AND DENOMINATOR STRINGS INTO VALUES
  50. 500 DP = NUM/DEN:DP = ( INT((DP +.005) *100)/100): REM  COMPUTE AND ROUND DECIMAL PORTION
  51. 510 DN =  ABS( VAL(W$)) +DP: IF  LEFT$(DF$,1) = "-"  THEN DN = ( -DN): IF  LEFT$(DF$,1) = "-"  AND DN >0  THEN DN =  -DN: REM  BUILD DECIMAL NUMBER AND CHECK IF LESS THAN 0
  52. 520  RETURN : REM  EXIT ROUTINE
  53. 530 L =  LEN(DF$): FOR INDX = 1 TO L: ON  MID$ (DF$,INDX,1) = " " GOTO 540: NEXT INDX: REM  IF NO FRACTION, TRY TO FIND THE WHOLE PORTION OF NUMBER
  54. 540 DN =  VAL( LEFT$(DF$,INDX)): RETURN : REM  CONVERT WHOLE PORTION INTO A VALUE AND EXIT ROUTINE